import {
  Injectable,
  ExecutionContext,
  NestInterceptor,
  CallHandler,
} from '@nestjs/common';
import { map } from 'rxjs/operators';
import { Observable } from 'rxjs';

interface data<T> {
  data: T;
}

@Injectable()
export class Response<T = any> implements NestInterceptor {
  // 写法一
  // intercept(context: ExecutionContext, next: CallHandler): Observable<data<T>> {
  //   return next.handle().pipe(
  //     map((data) => {
  //       return {
  //         data,
  //         status: 0,
  //         //   message: '成功',
  //       };
  //     }),
  //   );
  // }

  // 写法二
  async intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Promise<Observable<any>> {
    const [request, response] = context.getArgs();
    // switch (context.getType()) {
    //   case 'http':
    //     const [request, response, next_] = context.getArgs();
    //     console.log(
    //       `${request.protocol}://${request.hostname}${
    //         request.path
    //       }${JSON.stringify(request.query)} => ${context.getClass().name}.${
    //         context.getHandler().name
    //       }`,
    //     );
    //     break;
    //   case 'ws':
    //     break;
    //   case 'rpc':
    //     break;
    // }
    return next.handle().pipe(
      map((data) => {
        return {
          code: 0,
          message: '成功',
          ...data,
        };
      }),
    );
  }
}
